package com.example.activiti6_demo.demo2;

import org.activiti.engine.FormService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Activiti中总共有三种表单，动态表单，普通表单和外置表单
 */
@SpringBootTest
public class G_FormKey {

    /**
     * 仓储服务，用于管理流程仓库，例如：部署，删除，读取流程资源
     * 可以用来部署我们的流程图，还可以创建我们的流程部署查询对象，用于查询刚刚部署的流程列表，便于我们管理流程
     */
    @Resource
    private RepositoryService repositoryService;

    /**
     * 运行时服务，可以处理所有正在运行状态的流程实例，任务等
     * 主要用来开启流程实例，一个流程实例对应多个任务，也就是多个流程节点
     */
    @Resource
    private RuntimeService runtimeService;

    /**
     * 可以获取到流程启动节点的表单内容以及任务节点的表单内容
     */
    @Resource
    private FormService formService;

    /**
     * 动态表单
     * 用activiti:formProperty属性定义，可以在节点的Form中设置表单的动态内容，表单的内容都是以key和value的形式数据保存在引擎表中
     * 参考：https://blog.csdn.net/whatlookingfor/article/details/52998861/
     */
    @Test
    public void dynamicForm(Task task) throws Exception{
        TaskFormData taskFormData = formService.getTaskFormData(task.getId());
        //配置的字段
        List<FormProperty> formProperties = taskFormData.getFormProperties();
    }

    /**
     * 普通表单
     * activiti:formKey就是来定义我们启动界面或者某个任务环节处理界面的对应的表单标识的key
     * 填写的是具体页面地址如：/view/leave/leave.html
     */
    @Test
    public void commonForm(Task task) throws Exception{
        //方式一：activity6以上支持(推荐)
        String formKey = task.getFormKey();

        //方式二：activity5以上支持
        String processDefinitionId = "";
        String taskDefinitionKey = task.getTaskDefinitionKey();
        formKey = formService.getTaskFormKey(processDefinitionId, taskDefinitionKey);

        //方式三:
        TaskFormData taskFormData = formService.getTaskFormData(task.getId());
        formKey = taskFormData.getFormKey();
    }
}
